package com.lzj.demo.design.template;

import lombok.extern.slf4j.Slf4j;

/**
 * 案例:内部系统不同商户，调用我们系统接口，去跟外部第三方系统交互（http方式）。
 * */
@Slf4j
public abstract class AbstractMerchantService {
    //公司
    String companyName;

    public AbstractMerchantService(String companyName) {
        this.companyName = companyName;
    }

    //查询商户信息
    abstract void queryMerchantInfo();
    //加签
    abstract void signature();
    //http请求
    abstract void httpRequest();
    //验签
    abstract void verifySignature();
    // Http是否走代理（提供给子类实现）
    abstract boolean isRequestByProxy();

    /**
     * 抽象类定义骨架流程（1.查询商户信息，2.加签，3.http请求，4.验签）
     */
    void workFlow(){
        //①查询商户信息
        queryMerchantInfo();
        //②加签
        signature();
        //③http请求
        httpRequest();
        //④验签
        verifySignature();
    }
}

/**
 * 模板方法使用:
 * 1.一个抽象类，定义骨架流程（抽象方法放一起）
 * 2.确定的共同方法步骤，放到抽象类（去除抽象方法标记）
 * 3.不确定的步骤，给子类去差异化实现
 * */